package org.example.study2;

// 分别用串行和并行做两轮10亿次累加操作
public class Demo_201 {
    // 大数可以使用_分隔符
    // 多线程并不⼀定就能提⾼速度，可以观察，count 不同，实际的运⾏效果也是不同的
    private static long count = 1_000_000_000l;

    public static void main(String[] args) throws InterruptedException {
        // 串行
        serial();
        // 并行
        concurrency();

    }

    private static void concurrency() throws InterruptedException {
        // 记录开始时间
        long begin = System.currentTimeMillis();

        // 分别定义两个线程，各自执行累加操作
        Thread t1 = new Thread(() -> {
            long a = 0l;
            for (int i = 0; i < count; i++) {
                a++;
            }
        });
        // 启动t1线程
        t1.start();

        // 第二个线程
        Thread t2 = new Thread(() -> {
            long b = 0l;
            for (int i = 0; i < count; i++) {
                b++;
            }
        });
        // 启动t2线程
        t2.start();

        // 等待t1和t2执行完成
        t1.join();
        t2.join();

        // 记录结束时间
        long end = System.currentTimeMillis();
        System.out.println("并行执行耗时：" + (end - begin));
    }

    private static void serial() {

        // 记录开始时间
        long begin = System.currentTimeMillis();
        long a = 0l;
        for (int i = 0; i < count; i++) { // 第一个累加任务
            a++;
        }

        long b = 0l;
        for (int i = 0; i < count; i++) {// 第二个累加任务
            b++;
        }
        // 记录结束时间
        long end = System.currentTimeMillis();
        System.out.println("串行执行耗时：" + (end - begin));

    }
}

/*总结：一个大任务通过多线程的方式可以明显提升效率。
        例如private static long count = 1_000_000_000l;运用多线程是可以提升效率的
        运行可能：
        串行执行耗时：971
        并行执行耗时：470
        但是并不是任何时候多线程的效率都要比单线程高，当任务量很少的时候，单线程的效率可能会比多线程更高。
        例如：private static long count = 1_000_0l;任务量小，多线程并不会提升效率。
        运行可能：
        串行执行耗时：0
        并行执行耗时：1
        创建线程本身也有一定的系统开销，这个开销没有创建进程的开销大
        两个线程在CPU上调度也需要一定的时间*/
